iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 1
2

挑戰前言

這次的挑戰想讓自己成功堅持一件事情30天,我之前是個蠻3分鐘熱度的人,寫文章也總是很久才生出一篇覺得滿意的,比兩天捕魚三天曬網還誇張。

所以我這次我決定目標是每天都要有一定的產出,不要求一定要寫完整,以提高寫文章的效率。

可能文章會有寫錯或沒有把出處講完整的地方,或是中英混雜的太過嚴重,也可能系列文章安排順序沒有到很恰當,希望有看到文章的邦友,可以不吝指教,謝謝!

 
 

文章說明

第一篇我想分享的是我學習到的,一套寫訓練模型比較有彈性的程式架構,而且也可以讓你後續要找實驗記錄比較容易的架構。

我待會會用Carvana的dataset,與brats 2019的dataset先概念解釋訓練的流程中,尤其是segmentation task 會需要做到哪些事?以及需要紀錄什麼?之後再逐一列出要做的功能,並且提供檔案要怎麼分開的建議,接著一樣用兩個datasets來實際寫一遍,說明程式碼的部分,與注意事項。

文章分段:

  1. 挑戰前言
  2. 文章說明
  3. 簡介datasets
  4. 描述模型訓練的流程
  5. 程式架構:上程式的虛擬碼,預告要寫的檔案、功能有哪些
  6. 主程式的實際撰寫,註明程式開始不能單跑的地方
  7. 總結

好的,就讓我們開始吧!

 
 

簡介datasets

Carvana dataset

 

carvana 比賽主頁
 

Carvana是一個有許多展示車子照片的dataset,來自kaggle平台,車子照片是.jpg。label是.gif,常見做法會將label轉成.jpg。pixel數值的部分是background為0,車子部分為255。dataset的取得需要登入kaggle及電話。

這個dataset的原始放置方式是,data放在單獨一個資料夾,label放在另一個資料夾,以檔名編號進行配對:

.
└── Carvana              
     ├── train
     |    ├── 0001.jpg
     |    ├── 0002.jpg
     |    └── ...
     └── train_masks
          ├── 0001_mask.gif
          ├── 0002_mask.gif
          └── ...

 
 
 

brats dataset

 

2019年的比賽主頁,這年是由美國賓大的醫學佩雷爾曼學院主辦的樣子
 

brats比賽的data是mri影像,屬於醫學影像,因此它的取得需要提供資料及簽署使用同意書,原始資料是.nii.gz,是經過壓縮的nifti格式,不知道這種格式的可以把它簡單想成是儲存3d array的格式。brats是brain tumor segmentation的縮寫,他是專注於腦瘤分割的AI比賽。

label一樣是.nii.gz,從2018年開始,label的數值有變動,所以下載不同年度的data,記得去各年度網站確認label的數值。數值的部分一樣background為0,tumor、edema、還有缺氧壞死的部分各自編號1~4,我記得中間好像有跳號,具體原因不清楚。

這個dataset的原始放置方式是,先分成train和validation,再以tumor的grade區分為high和low,接著是以病患為單位,每個資料夾裡放了此病患的所有mri序列與label,validation的資料則沒有以tumor grade分開。

因為這種資料涉及病患隱私,所以各病患的資料會轉為一系列的代號,有興趣的人可以在查anonymization:

.
└── brats2019              
     ├── Training
     |    ├── HGG/
     |    |    ├── patient_1/
     |    |    |    ├── patient1_flair.nii.gz
     |    |    |    ├── patient1_seg.nii.gz
     |    |    |    ├── patient1_t1.nii.gz
     |    |    |    ├── patient1_t1ce.nii.gz
     |    |    |    └── patient1_t2.nii.gz
     |    |    └── patient_2/
     |    |    |    └── ...
     |    |    └── ...
     |    └── LGG/
     |         ├── patient_n/
     |         |    └── ...
     |         └── ...
     └── Validation
          ├── patient_m/
          |    └── ...
          └── ...

 
 

描述模型訓練的流程

模型訓練的第一步,是先了解你的task,要用哪種方式達成,是classification? detection? 還是segmentation等任務。

我今天要舉的兩個例子,都是segmentataoin任務,我想展示的是,不同的原始資料根據各自的特性處理完後,是如何透過同個流程進行訓練的。

Step 1 處理原始資料,分析資料
Step 2 根據各資料集的特性,把資料轉成tfrecord
Step 3 依照當初所轉的tfrecord的格式,將資料轉換回來
Step 4 將轉換的資料進行前處理
Step 5 擬定此次hyper parameter要設什麼
Step 6 準備空model,視情況將pre-trained weight載入
Step 7 根據此次訂定的hyper parameter去跑訓練
Step 8 紀錄訓練中的想記錄的情況
Step 9 將訓練的model或weight儲存及結果可視化
Step 10 再次準備空model,將訓練好的weight載入(或載入訓練好的model)
Step 11 直接將data輸入模型,產生output與label配對檢視
Step 12 根據task去選擇適合的metric,然後對訓練的model進行評分

其中一些步驟會有需要注意的事項:

像是據我目前所學知道的是,雖然目前有許多理論提出可以免除固定大小的input data,但在目前的框架像tensorflow、torch等,實作是不可行的。模型訓練用的資料分佈與真實場景的資料分布越一致,理論上應用的準確度和穩定性都會提升。而且一旦選定了input size,pretrained的weight也只能適用於同一input size,因此input size也算是hyper parameter之一,只是他常常有固定的常用size。

以上是Step 1 ~ 4需要注意的部分。

為了測試模型最適合的參數是什麼,在訓練時會去改動hyper parameter,像是loss的選用、learning rate的調整、train data的分佈、模型有沒有變形、使用backbone、data augmentation做了什麼,前處理做了什麼等等,有太多太多的參數需要紀錄,才能在分析模型時有清晰正確的實驗數據輔佐,而這些可能每一次都只有更動一項變數而已,為了實驗的流暢性,Step 5勢必要變成自動去紀錄,才能省下許多功夫。

而Step 8,也是重要的一環,很多時候,尤其是與他人合作,共用硬體資源時,不能如期地跑完完整的程式,因此程式除了做到在訓練完成時紀錄訓練資訊之外,最好是即使按下ctrl+c也能取得當前的訓練情形,並且有能力恢復中斷過的訓練。

 
 

目前能想到的大致上就是這樣,寫文章2跟3段就花了我3小時,之後的第4段和第5段就等明天再繼續接著吧。

感謝你的觀看,請不要吝嗇留下你的建言,讓還在學習的我能夠多開開眼界。

 


更正:
常見做法會將照片label轉成.jpg
寫文章1跟2段2跟3段
之後的第3段和第4段第4段和第5段


下一篇
一、用skeleton code解釋tensorflow model程式執行方式(tf.keras) ep.2
系列文
從零.4開始我的深度學習之旅:從 用tf.data處理資料 到 用tf.estimator或tf.keras 訓練模型30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
阿瑜
iT邦研究生 3 級 ‧ 2020-09-16 16:28:56

第一篇的質量就好高
需要好好理解、消化

/images/emoticon/emoticon12.gif

我要留言

立即登入留言